/*
 * 文件名：BaseServiceImpl.java
 * 版权： 航天恒星科技有限公司
 * 描述：〈描述〉
 * 修改时间：2015年6月4日
 * 修改内容：〈修改内容〉
 */
package com.zmkm.project.dbserver.utils;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Transactional;

/**
 *
 * 〈一句话功能简述〉业务层基本实现类 〈功能详细描述〉
 * 此实现类，实现了基本的增删改查功能，其它service实现类继承了此类后，可以不用再实现基本的增删改查功能
 *
 * @author chenl
 * @version [版本号, 2015年5月7日]
 * @param <T>
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@Transactional(readOnly = false)
public abstract class BaseServiceImpl<T> implements IBaseService<T> {
    
    /**
     * {@inheritDoc}
     *
     */
    public T save(T entity)
        throws Exception {
        try {
            ((IBaseEntity) entity).setId(StringUtils.createUUID());
            entity = getBaseDao().save(entity) > 0 ? entity : null;
            // 记录操作成功信息
        }
        catch (Exception e) {
            transactionException(1, e, entity);
        }
        
        // 记录程序执行方法结束调试日志
        return entity;
        
    }
    
    /**
     * {@inheritDoc}
     *
     */
    public T update(T entity)
        throws Exception {
        
        try {
            entity = getBaseDao().update(entity) > 0 ? entity : null;
        }
        catch (Exception e) {
            transactionException(1, e, entity);
        }
        
        return entity;
    }
    
    /**
     * {@inheritDoc}
     *
     */
    public boolean deletes(String... ids)
        throws Exception {
        
        boolean res = false;
        try {
            res = getBaseDao().remove(ids) > 0 ? true : false;
            
        }
        catch (Exception e) {
            transactionException(1, e, ids);
        }
        
        return res;
        
    }
    
    /**
     * {@inheritDoc}
     *
     */
    public int remove(String... ids)
        throws Exception {
        int count = 0;
        try {
            count = getBaseDao().remove(ids);
        }
        catch (Exception e) {
            transactionException(1, e, ids);
        }
        return count;
    }
    
    /**
     * {@inheritDoc}
     *
     */
    @Transactional(readOnly = true)
    public T findById(Serializable id)
        throws Exception {
        T t = null;
        
        try {
            t = getBaseDao().findById(id);
            
        }
        catch (Exception e) {
            transactionException(1, e, id);
        }
        
        return t;
    }
    
    /**
     * {@inheritDoc}
     *
     */
    @Transactional(readOnly = true)
    public List<T> findAll()
        throws Exception {
        
        List<T> ts = null;
        
        try {
            ts = getBaseDao().findAll();
            
        }
        catch (Exception e) {
            transactionException(1, e);
        }
        
        return ts;
    }
    
    /**
     * {@inheritDoc}
     *
     */
    @Transactional(readOnly = true)
    public List<T> findByParams(Map<String, Object> params)
        throws Exception {
        
        List<T> ts = null;
        
        try {
            ts = getBaseDao().findByParams(params);
            
        }
        catch (Exception e) {
            transactionException(1, e, params);
        }
        
        return ts;
    }
    
    /**
     * {@inheritDoc}
     *
     */
    @Transactional(readOnly = true)
    public int getCount(Map<String, Object> params)
        throws Exception {
        
        int count = 0;
        
        try {
            count = getBaseDao().getCount(params);
            
        }
        catch (Exception e) {
            transactionException(1, e, params);
        }
        
        return count;
    }
    
    /**
     * 〈一句话功能简述〉获得该指定Dao接口 〈功能详细描述〉
     * 
     * @return 指定的dao接口
     * @see [类、类#方法、类#成员]
     */
    public abstract IBaseDao<T> getBaseDao();
    
    /**
     * 〈一句话功能简述〉当事务操作某一阶段未成功则需要使用此异常抛出，回滚事务 〈功能详细描述〉
     * 
     * @param code 错误码
     * @param e 异常
     * @param operationObject 操作对象
     * @throws Exception 运行时异常
     * @see [类、类#方法、类#成员]
     */
    protected void transactionException(int code, Exception e,
        Object operationObject)
        throws Exception {
        throw new CustomException(code, e, operationObject);
    }
    
    /**
     * 
     * 〈一句话功能简述〉当事务操作某一阶段未成功则需要使用此异常抛出，回滚事务 〈功能详细描述〉
     * 
     * @param code 错误码
     * @param e 异常
     * @throws Exception 运行时异常
     * @see [类、类#方法、类#成员]
     */
    protected void transactionException(int code, Exception e)
        throws Exception {
        throw new CustomException(code, e);
    }
    
    /**
     *
     * 〈一句话功能简述〉当事务操作某一阶段未成功则需要使用此异常抛出，回滚事务 〈功能详细描述〉
     *
     * @param code 错误码
     * @throws Exception 运行时异常
     * @see [类、类#方法、类#成员]
     */
    protected void transactionException(int code)
        throws Exception {
        throw new CustomException(code);
    }
    
}
